package cc.rengu.igas.bomp.core.service.trans;

import cc.rengu.igas.bomp.common.dao.MchntBaseInfoMapper;
import cc.rengu.igas.bomp.common.dao.MchntSignInfoMapper;
import cc.rengu.igas.bomp.common.dao.impl.MchntBaseInfoMapperImpl;
import cc.rengu.igas.bomp.common.dao.impl.MchntSignInfoMapperImpl;
import cc.rengu.igas.bomp.common.entity.MchntBaseInfo;
import cc.rengu.igas.bomp.common.entity.MchntSignInfo;
import cc.rengu.igas.bomp.common.enums.MchntStatusEnum;
import cc.rengu.igas.bomp.common.enums.MchntStopReasonEnum;
import cc.rengu.igas.bomp.common.enums.MchntTypeEnum;
import cc.rengu.igas.bomp.common.enums.RespCodeEnum;
import cc.rengu.igas.bomp.core.service.base.ManageService;
import cc.rengu.igas.bomp.facade.bean.MchntStatusInfoBean;
import cc.rengu.igas.bomp.facade.enums.BompSignLicenceTypeEnum;
import cc.rengu.igas.bomp.facade.request.MchntStatusInfoListQueryRequest;
import cc.rengu.igas.bomp.facade.response.MchntStatusInfoListQueryResponse;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.utility.util.BeanUtil;
import cc.rengu.oltp.utility.util.ConvertUtil;
import cc.rengu.oltp.utility.util.StringUtil;

import java.util.ArrayList;
import java.util.List;


/*
 * @author zhouyi
 * @version 1.0
 * @date 2021年4月21日10:06:23
 * @date 2019/08/15
 */
public class MchntStatusInfoListQueryService extends ManageService {
    @Override
    protected Object bizBeforeCust() throws Exception {
        MchntStatusInfoListQueryRequest mchntStatusInfoListQueryRequest = new MchntStatusInfoListQueryRequest();
        ConvertUtil.convertOutput(mchntStatusInfoListQueryRequest);
        return mchntStatusInfoListQueryRequest;
    }

    @Override
    protected BizResponse bizProcessCust(Object request) throws Exception {
        MchntStatusInfoListQueryRequest mchntStatusInfoListQueryRequest = (MchntStatusInfoListQueryRequest) request;
        MchntStatusInfoListQueryResponse mchntStatusInfoListQueryResponse = new MchntStatusInfoListQueryResponse();
        mchntStatusInfoListQueryResponse.setHeader(mchntStatusInfoListQueryRequest.getHeader());
        BizResponse<MchntStatusInfoListQueryResponse> bizResponse = new BizResponse<>();
        bizResponse.setRspSysId(AppParamConstant.SYS_ID);
        bizResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        bizResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setResult(mchntStatusInfoListQueryResponse);
        String instId = mchntStatusInfoListQueryRequest.getHeader().getInstId();
        String artifName = mchntStatusInfoListQueryRequest.getArtifName();
        String mchntType = mchntStatusInfoListQueryRequest.getMchntType();
        String licenceCode = mchntStatusInfoListQueryRequest.getLicenceCode();
        String licenceType = mchntStatusInfoListQueryRequest.getLicenceType();
        String artifCertNo = mchntStatusInfoListQueryRequest.getArtifCertNo();
        String artifCertType = mchntStatusInfoListQueryRequest.getArtifCertType();

        /* 必填项校验*/
        if (StringUtil.isEmptyOrNull(instId) || StringUtil.isEmptyOrNull(mchntType)) {
            rglog.error("必填性校验失败!");
            throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
        }
        /* 首先判断该用户是否已经入驻*/
        /* 1.商户类型为小微商户时*/
        /* 先查询签约信息表，再查询基本信息表*/
        if (MchntTypeEnum.WECHAT_MCHNT.getMchntType().equals(mchntType)) {
            /* 必填项校验*/
            if (StringUtil.isEmptyOrNull(artifName) || StringUtil.isEmptyOrNull(artifCertNo)
                    || StringUtil.isEmptyOrNull(artifCertType)) {
                rglog.error("必填性校验失败!");
                throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
            }
            MchntSignInfoMapper mchntSignInfoMapper = new MchntSignInfoMapperImpl();
            List<MchntSignInfo> mchntSignInfoList = mchntSignInfoMapper.selectBompMchntSignInfoByArtifId(instId, artifCertNo, artifCertType);
            if (null == mchntSignInfoList || 0 == mchntSignInfoList.size()) {
                /* 没有该商户信息，进行响应*/
                rglog.debug("根据法人证件类型和证件号查询商户信息为空，证件类型<{}>,证件号<{}>", artifCertType, artifCertNo);
                return bizResponse;
            }
            /* 根据获取的签约信息，去查询基本表*/
            List<MchntStatusInfoBean> mchntStatusInfoBeanList = getMchntStatusInfoBeanList(mchntSignInfoList, instId);
            if (0 == mchntStatusInfoBeanList.size()) {
                rglog.error("商户入驻情况信息添加失败");
                return bizResponse;
            }

            mchntStatusInfoListQueryResponse.setMchntStatusInfoBeanList(mchntStatusInfoBeanList);
            return bizResponse;
        } else {
            /* 2.商户类型为其他商户时*/
            /* 必填项校验*/
            if (StringUtil.isEmptyOrNull(licenceType)) {
                rglog.error("必填性校验失败!");
                throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
            }
            /*  如果证件类型为营业执照，证件号必送*/
            if (BompSignLicenceTypeEnum.BUSINESS_LICENSE.getType().equals(licenceType)) {
                if (StringUtil.isEmptyOrNull(licenceCode)) {
                    rglog.error("必填性校验失败!");
                    throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
                }
            }
            /*licenceCode 为空，直接返回无商户*/
            if (StringUtil.isEmptyOrNull(licenceCode)) {
                return bizResponse;
            }

            MchntSignInfoMapper mchntSignInfoMapper = new MchntSignInfoMapperImpl();
            /* 根据执照信息查询*/
            List<MchntSignInfo> mchntSignInfoList = mchntSignInfoMapper.selectBompMchntSignInfoByLicenceInfo(instId, licenceType, licenceCode);
            if (null == mchntSignInfoList || 0 == mchntSignInfoList.size()) {
                /* 没有该商户信息，进行响应*/
                rglog.debug("根据营业执照类型和证件号查询商户信息为空，证件类型<{}>,证件号<{}>", artifCertType, artifCertNo);
                return bizResponse;
            }
            /* 根据获取的签约信息，去查询基本表*/
            List<MchntStatusInfoBean> mchntStatusInfoBeanList = getMchntStatusInfoBeanList(mchntSignInfoList, instId);
            if (0 == mchntStatusInfoBeanList.size()) {
                rglog.error("商户入驻情况信息添加失败");
                return bizResponse;
            }

            mchntStatusInfoListQueryResponse.setMchntStatusInfoBeanList(mchntStatusInfoBeanList);
            return bizResponse;
        }
    }

    private List<MchntStatusInfoBean> getMchntStatusInfoBeanList(List<MchntSignInfo> mchntSignInfoList, String instId) throws Exception {
        List<MchntStatusInfoBean> mchntStatusInfoBeanList = new ArrayList<>();
        for (MchntSignInfo mchntSignInfo : mchntSignInfoList) {
            String mchntNo = mchntSignInfo.getMchntNo();
            MchntBaseInfoMapper mchntBaseInfoMapper = new MchntBaseInfoMapperImpl();
            MchntBaseInfo mchntBaseInfo = mchntBaseInfoMapper.selectMchntBaseInfoByPrimaryKey(instId, mchntNo);
            if (null == mchntBaseInfo) {
                //rglog.error(RespCodeEnum.MCHNT_INST_IS_NULL.getRespDesc());
                //throw new BizException(RespCodeEnum.MCHNT_INST_IS_NULL.getRespCode(), RespCodeEnum.MCHNT_INST_IS_NULL.getRespDesc());
                continue;
            }

            MchntStatusInfoBean mchntStatusInfoBean = new MchntStatusInfoBean();
            BeanUtil.beanCopy(mchntBaseInfo, mchntStatusInfoBean);
            if (MchntStatusEnum.DISUSE.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
                /* 获取最后审核时间为停用时间*/
                rglog.info("该商户为停用商户");
                String lastAuditTime = mchntBaseInfo.getLastAuditTime();
                mchntStatusInfoBean.setMchntStopTime(lastAuditTime);
                String mchntStopReason = mchntBaseInfo.getMchntStopReason();
                String stopReason = MchntStopReasonEnum.getMchntStopReasonDescByCode(mchntStopReason);
                if (StringUtil.isEmptyOrNull(stopReason)) {
                    stopReason = mchntStopReason;
                }
                mchntStatusInfoBean.setMchntStopReason(stopReason);
            }

            if (MchntStatusEnum.CANCEL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
                /* 获取最后审核时间为注销时间*/
                rglog.info("该商户为注销商户");
                String lastAuditTime = mchntBaseInfo.getLastAuditTime();
                mchntStatusInfoBean.setMchntCancelTime(lastAuditTime);
                mchntStatusInfoBean.setMchntCancelReason(mchntBaseInfo.getMchntCancelReason());
            }
            mchntStatusInfoBeanList.add(mchntStatusInfoBean);
        }
        return mchntStatusInfoBeanList;
    }

    @Override
    protected void bizAfterCust(Object response) throws Exception {
        BizResponse bizResponse = (BizResponse) response;
        MchntStatusInfoListQueryResponse mchntStatusInfoListQueryResponse = (MchntStatusInfoListQueryResponse) bizResponse.getResult();
        ConvertUtil.convertInput(mchntStatusInfoListQueryResponse);
    }
}
